package socketexercise;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server2 {
    /**
     * 聊天室的服务端 版本2
     *
     * 这一个版本我们利用多线程来完成与客户端的交互,使得主线程只负责接收连接即可.
     * 从而实现多个客户端可以同时连接服务端,并且每个客户端发送的消息服务端都可以接收到.
     *
     * 具体做法:
     * 1:在Server类中定义一个内部类:ClientHandler并实现Runnable接口,作为线程任务
     * 2:ClientHandler的run方法中完成原接收客户端连接后的所有操作
     *   具体包括:
     *   通过Socket获取输入流并进行流连接为BufferedReader
     *   循环通过输入流读取客户端发送过来的一行字符串并输出
     * 3:start方法中(主线程执行的操作),当调用ServerSocket的accept方法接受一个客户端连接后就
     *   启动一个线程来执行任务ClientHandler并将该Socket交给它来与该客户端交互的工作.
     *   这样一来主线程就可以立即再次循环调用accept继续等待新客户端的连接了.
     *
     * 从而实现功能要求
     *
     */
   private ServerSocket serverSocket;


    public Server2(){
        try {
            System.out.println("正在启动服务器");
            serverSocket=new ServerSocket(8090);//向服务端申请服务端口，客户端就是通过该端口与服务器建立连接的
            System.out.println("服务器启动完毕");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void start(){
        try {
            System.out.println("等待客户端连接");
            Socket socket= serverSocket.accept();//main主线程负责接收客户端的连接
            System.out.println("一个客户端连接上了");

            ClientHander hander=new ClientHander(socket);
            Thread t=new Thread(hander);//t线程负责处理客户端的消息，进行输出
            t.start();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        Server2 server=new Server2();
        server.start();

    }

    /**
     * 实现线程任务
     */
    public class ClientHander implements Runnable{
        private Socket socket;
        private String host;
        public ClientHander(Socket socket){
            this.socket=socket;
            host=socket.getInetAddress().getHostAddress();
        }

        public void run(){
            try {
                InputStream in=socket.getInputStream();//低级流
                InputStreamReader isr=new InputStreamReader(in);
                BufferedReader br=new BufferedReader(isr);
                String message;
                while((message=br.readLine())!=null){

                    System.out.println(host+"说："+message);
                }


            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }
}
